class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        long long a = numerator, b = denominator; // 长除法
        string sign = a * b < 0 ? "-" : "";
        a = abs(a); // 保证下面的计算过程不产生负数
        b = abs(b);

        // 计算整数部分 q 和初始余数 r
        long long q = a / b, r = a % b;
        if (r == 0) // 没有小数部分
            return sign + to_string(q);

        string ans = sign + to_string(q) + ".";
        unordered_map<long long, int> r_to_pos = {{r, ans.size()}}; // 记录初始余数对应位置
        while (r)
        {
            r *= 10; // 计算小数点后的数字 q，更新 r
            q = r / b;
            r %= b;
            ans += '0' + q;
            if (r_to_pos.contains(r)) // 有循环节
            {
                int pos = r_to_pos[r]; // 循环节的开始位置
                return ans.substr(0, pos) + "(" + ans.substr(pos) + ")";
            }
            r_to_pos[r] = ans.size(); // 记录余数对应位置
        }
        return ans; // 有限小数
    }
};